package com.ssy.lingxi.search.service;

import com.ssy.lingxi.common.constant.tree.Node;
import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.search.api.model.request.CommoditySearchRequest;
import com.ssy.lingxi.search.api.model.request.ShareCodeRequest;
import com.ssy.lingxi.search.api.model.response.*;
import com.ssy.lingxi.search.common.tree.BrandNode;
import com.ssy.lingxi.search.entity.Commodity;
import com.ssy.lingxi.search.model.response.CategoryBrandResponse;
import com.ssy.lingxi.search.model.response.CategoryCommodityResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;

import java.util.List;
import java.util.Set;

/**
 * 商品搜索管理类
 * @author jw.chen
 * @version 2.0.0
 * @date 2020/7/28
 */
public interface ICommodityService {
    /**
     * 分页查询商品列表
     * @param searchRequest             请求参数
     * @param isHighlight               是否需要高亮显示
     * @param isScoreShop               是否是积分商城
     */
    PageData<CommoditySearchResponse> searchCommodityList(CommoditySearchRequest searchRequest, Boolean isHighlight, Boolean isScoreShop);

    /**
     * 查询商品列表
     * @param searchRequest
     * @return
     */
    List<CommoditySearchResponse> queryCommodityList(CommoditySearchRequest searchRequest);

    /**
     * 查询商品详情
     * @param commodityId
     * @return
     */
    CommodityResponse getCommodityDetail(Long commodityId, Long shopId, UserLoginCacheDTO sysUser);

    /**
     * 通过商品skuId查询商品
     * @param commoditySkuId
     * @return
     */
    CommodityResponse getCommodityDetailBySkuId(Long commoditySkuId, Long shopId, UserLoginCacheDTO sysUser);

    /**
     * 查询商品库存
     * @param commodity
     * @param memberId
     * @return
     */
    void getCommodityStock(Commodity commodity, Long memberId, Long shopId);

    /**
     * 查询商品品类树
     * @param memberId 会员id
     * @return
     */
    List<Node> getCategoryTree(Long shopId, Long memberId);

    /**
     * 查询属性
     * @param memberId
     * @param categoryId
     * @return
     */
    List<AttributeResponse> getAttributeByCategoryId(Long shopId, Long memberId, Long categoryId);

    /**
     * 查询商品品牌
     * @return
     */
    List<BrandResponse> getBrand(Long shopId, Long memberId);

    /**
     * 查询商品品牌
     * @return
     */
    List<BrandNode> getPinyinSortBrand(Long shopId, Long memberId);

    /**
     * 查询商品最大价格/最大积分
     * @return
     */
    Double getCommodityMaxPrice(Long storeId);

    /**
     * 查询归属地市
     * @param memberId  会员id
     * @return
     */
    List<ProvinceResponse> getArea(Long shopId, Long memberId);

    /**
     * 查询es中商品数据对应的区域信息
     * @param queryBuilder 查询条件
     */
    List<ProvinceResponse> queryEsArea(BoolQueryBuilder queryBuilder);

    /**
     * 商品搜索自动补全
     * @param shopId            商城id
     * @param channelShopId     渠道商城id
     * @param name 商品名称
     * @return
     */
    List<String> getCommodityCompletion(Long shopId, Long channelShopId, String name);

    /**
     * 查询商品是否上架
     * @param commodityId
     * @return
     */
    Boolean getCommodityIsPublish(Long commodityId, Integer type, Long channelMemberId, Long memberId);



    /**################################################  APP  ##############################################################**/
    /**
     * 查询一级商品品类
     * @return
     */
    List<SimpleNameUrlResponse> getFirstCategory(Long shopId, Long memberId);

    /**
     * 根据品牌id查询品类下的品牌
     * @returnPOST
     */
    List<CategoryBrandResponse> getCategoryByBrand(List<Long> brandIdList, Long shopId);

    /**
     * 根据商品id查询品类下的商品
     * @return
     */
    List<CategoryCommodityResponse> getCategoryByCommodityId(List<Long> commodityIdList);

    /**
     * 根据一级品类查询品牌
     * @param categoryId 一级品类id
     * @returnPOST
     */
    Set<BrandResponse> getBrandByFirstCategory(Long categoryId, Long shopId);

    /**
     * 根据一级品类查询品牌
     * @param customerCategoryId 一级品类id
     * @returnPOST
     */
    Set<BrandResponse> getBrandByFirstCustomerCategory(Long customerCategoryId, Long shopId);

    /**
     * 根据不同会员匹配价格策略
     * @param commodity
     * @param shopId
     * @param loginMemberId
     * @param loginMemberRoleId
     */
    void setCommodityPrice(Commodity commodity, Long shopId, Long loginMemberId, Long loginMemberRoleId, Integer loginMemberLevel);

    /**
     * 保存分享码
     * @param shareCodeRequest
     * @return
     */
    Boolean saveShareCode(ShareCodeRequest shareCodeRequest);

    /**
     * 查询分享码
     * @param code
     * @return
     */
    String getShareCode(String code);

    /**
     * 通过商品skuId查询商品库存
     * @param shopId            商城id
     * @param memberId          会员id
     * @param commoditySkuId    商品skuId
     */
    double getCommodityStockBySkuId(Long shopId, Long memberId, Long commoditySkuId);

    /**
     * 查询商品sku信息
     * @param commoditySearchRequest 请求参数
     */
    List<CommoditySkuResponse> getCommoditySkuList(CommoditySearchRequest commoditySearchRequest);
}
